'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-06-29 10:20:25
'''
'''
5451. 满足不等式的最大值
给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标，并按照横坐标 x 的值从小到大排序。也就是说 points[i] = [xi, yi] ，并且在 1 <= i < j <= points.length 的前提下， xi < xj 总成立。

请你找出 yi + yj + |xi - xj| 的 最大值，其中 |xi - xj| <= k 且 1 <= i < j <= points.length。

题目测试数据保证至少存在一对能够满足 |xi - xj| <= k 的点。

 

示例 1：

输入：points = [[1,3],[2,0],[5,10],[6,-10]], k = 1
输出：4
解释：前两个点满足 |xi - xj| <= 1 ，带入方程计算，则得到值 3 + 0 + |1 - 2| = 4 。第三个和第四个点也满足条件，得到值 10 + -10 + |5 - 6| = 1 。
没有其他满足条件的点，所以返回 4 和 1 中最大的那个。
示例 2：

输入：points = [[0,0],[3,0],[9,2]], k = 3
输出：3
解释：只有前两个点满足 |xi - xj| <= 3 ，带入方程后得到值 0 + 0 + |0 - 3| = 3 。
'''
from typing import List
class Solution:
    def findMaxValueOfEquation(self, points: List[List[int]], k: int) -> int:
        re = -2e9
        store = []
        for point in points:
            x = point[0]
            y = point[1]
            while store and x-store[0][0]>k:
                store.pop(0)
            if store:
                re = max(re, x+y+store[0][1])
                # print (x, y, re, store)
            # 维护队列，使队列为单调队列。
            while store and store[-1][1]<=y-x:
                store.pop()
            store.append((x, y-x))
            
        return re

if __name__ == "__main__":
    solution = Solution()
    points = [[1,3],[2,0],[5,10],[6,-10]]
    k = 1
    print(solution.findMaxValueOfEquation(points, k))